
// 生成器函数，执行的结果是迭代器
// function* read() {
//     console.log('first');
//     yield 1;
//     console.log('second');
//     yield 2;
//     console.log('third');
//     yield 3;
// }

// let it = read(); // 迭代器
// it.next(); // first
// it.next(); // second
// it.next(); // third

// function* read() {
//     var a = yield 1;
//     console.log(a); // 1
//     var b = yield 2;
//     console.log(b); // 2
//     var c = yield 3;
//     console.log(c); // 3
// }

// let it = read(); // 迭代器
// let value, done;
// do {
//     let { value: v, done: d } = it.next(value);
//     value = v;
//     done = d;
// } while(!done);

// let regeneratorRuntime = {
//     wrap(iteratorFn) {
//         const context = {
//             prev: 0,
//             next: 0,
//             sent: '',
//             done: false,
//             stop() {
//                 this.done = true;
//             }
//         }
//         // 迭代器
//         let it = {};
//         it.next = function (v) {
//             context.sent = v; // next传参
//             let value = iteratorFn(context);
//             return {
//                 value,
//                 done: context.done
//             }
//         }
//         return it;
//     }
// }

// function read() {
//     return regeneratorRuntime.wrap(function read$(_context) {
//         while (1) {
//             switch (_context.prev = _context.next) {
//                 case 0:
//                     _context.next = 2;
//                     return 1;

//                 case 2:
//                     a = _context.sent;
//                     console.log(a);
//                     _context.next = 6;
//                     return 2;

//                 case 6:
//                     b = _context.sent;
//                     console.log(b);
//                     _context.next = 10;
//                     return 3;

//                 case 10:
//                     c = _context.sent;
//                     console.log(c);

//                 case 12:
//                 case "end":
//                     return _context.stop();
//             }
//         }
//     });
// }

// let it = read(); // 迭代器
// {
//     let { value, done } = it.next('xxx'); // 从实现上可以看到case 0里没有用到context.sent，所以第一个传参被忽略
//     console.log(value, done); // 1 false
// }
// {
//     let { value, done } = it.next('aaa'); // aaa
//     console.log(value, done); // 2 false
// }
// {
//     let { value, done } = it.next('bbb'); // bbb
//     console.log(value, done); // 3 false
// }
// {
//     let { value, done } = it.next('ccc'); // ccc
//     console.log(value, done); // undefined true
// }


// const fs = require('fs');
// const util = require('util');
// // const co = require('co');
// let readFile = util.promisify(fs.readFile);

// function co(it) {
//     return new Promise((resolve, reject) => {
//         // 异步迭代用递归
//         function next(data) {
//             let { value, done } = it.next(data);
//             if (done) {
//                 resolve(value);
//             } else {
//                 Promise.resolve(value).then(next, reject);
//             }
//         }
//         next();
//     })
// }

// function* read() {
//     let data = yield readFile('./a.txt', 'utf8');
//     data = yield readFile(data, 'utf8');
//     return data;
// }

// // 不用co
// let it = read();
// let { value, done } = it.next();
// value.then((data) => {
//     console.log(data);
//     let { value, done } = it.next(data);
//     value.then(data => {
//         let { value, done } = it.next(data);
//         console.log(value, done);
//     })
// })

// 用co
// co(read()).then(data => {
//     console.log(data); // b
// }).catch(err => {
//     console.log(err);
// })


// // async await 
// const fs = require('fs');
// const util = require('util');
// let readFile = util.promisify(fs.readFile);
// async function read() {
//     let data = await readFile('./a.txt', 'utf8');
//     data = await readFile(data, 'utf8');
//     return data;
// }

// read().then(data => {
//     console.log(data); // b
// })

